/*
 * @Author: dgflash
 * @Date: 2021-11-11 19:05:32
 * @LastEditors: dgflash
 * @LastEditTime: 2022-09-06 17:20:51
 */

import { _decorator } from 'cc';
import { GameComponent } from './GameComponent';
import { ecs } from '../../libs/ecs/ECS';

const { ccclass, property } = _decorator;

/** 
 * 游戏显示对象组件
 * 
 * 功能介绍：
 * 1. 对象拥有 cc.Component 组件功能与 ecs.Comp 组件功能
 * 2. 对象自带全局事件监听、释放、发送全局消息功能
 * 3. 对象管理的所有节点摊平，直接通过节点名获取cc.Node对象
 * 
 * 应用场景
 * 1. 网络游戏，优先有数据对象，然后创建视图对象，当释放视图组件时，部分场景不希望释放数据对象
 * 
 * @example
@ccclass('RoleViewComp')
@ecs.register('RoleView', false)
export class RoleViewComp extends CCComp {
    @property({ type: sp.Skeleton, tooltip: '角色动画' })
    spine: sp.Skeleton = null!;

    onLoad(){
        
    }
}
 */
@ccclass('CCComp')
export abstract class CCComp extends GameComponent implements ecs.IComp {
    tid: number = -1;
    static compName: string;

    canRecycle!: boolean;
    ent!: ecs.Entity;

    // cxw：这个 OnLoad 接口是我设计的，dgflash 希望entity是外部创建，然后自己赋值。
    // 而我看 shangdibaozi/ECS 设计的 .ent 是在 onLoad 中创建的。
    // dgflash 的 考虑是 CComp 必须依赖于 ecs.Entity，而原作者的设计是 CComp 可以独立使用的。参考如下
    /*
    import { Component, _decorator } from "cc";
    const { ccclass, property } = _decorator;
    @ccclass('Player')
    @ecs.register('Player', false)
    export class Player extends CCComp {
        @property({
            type: MovementComponent
        })
        movement: MovementComponent;

        onLoad() {
            super.onLoad();
            // 添加MovementComponent组件对象
            this.ent.add(this.movement);
        }
    }
    */
    onLoad() {
        this.ent = ecs.createEntity();
        this.ent.add(this);    
    }

    abstract reset(): void;
}